class IronMan {
  personName: string;
  def: number;
  atk: number;
  hp: number;
  constructor(name: string) {
    this.personName = name;
    this.def = 2; // 防御值
    this.atk = 2; // 攻击力
    this.hp = 10; // 血量
  }

  // 防御
  @addHideDef(10)
  handleDef(vlaue: number) {
    this.def += vlaue;
    console.log(`${this.personName} def ${this.def}`);
  }
}

function addHideDef(count) {
  return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
    
    let func = function (...args) {
      args[0] += count;
      // 这里的apply() 
      // 第一个参数的含义是, 指定调用哪个对象
      // 第二个参数的含义是, 被调用的函数所包含的数组
      // 如果要指向实例化后的对象用this
      // 如果要指向类本身用target
      return descriptor.value.apply(this, args);
    };
    return {
      ...descriptor,
      value: func,
    };
  };
}

export default IronMan;
